#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
//函数外全局变量定义
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;
int enemy_x,enemy_y;//敌机位置
int score;//游戏得分
void gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
void startup()//数据初始化
{
   high=20;
   width=30;
   position_x=high/2;
   position_y=width/2;
   bullet_x=-1;
   bullet_y=position_y;
   enemy_x=0;
   enemy_y=position_y;
   score=0;
}
void show()//显示画面
{
    gotoxy(0,0);
   int i,j;
   for(i=0;i<=high;i++)
   {
      for(j=0;j<=width;j++)
      {
          if((i==position_x)&&(j==position_y))
            printf("*");//飞机

           else if((i==bullet_x)&&(j==bullet_y))
            printf("|");//飞机子弹
            else if((i==enemy_y)&&(j==enemy_y))
            printf("@");//敌机位置
            else
            printf(" ");//输出空格

      }
      printf("\n");
   }
   printf("得分：%d\n",score);
}
void updatewithoutinput()//与用户输入无关的更新
{if(bullet_x>-1)
    bullet_x--;
    if((bullet_x==enemy_x)&&(bullet_x==enemy_y))
    {
        score++;
        enemy_x=0;
        enemy_y=rand()%width;
        bullet_x=-1;
    }
        if(enemy_x>high)
   {
       enemy_x=-1;
       enemy_y=rand()%width;
   }
    static int speed=0;//用于控制飞机下落
    if(speed<15)
        speed++;


         if(speed==15)
       {
           enemy_x++;
           speed=0;
       }


    }
void updatewithinput()//与用户输入有关的更新
{
   char input;
   if(kbhit())//当按下键时执行
   {
       input=getch();
       if(input=='a')
        position_y--;
       if(input=='d')
        position_y++;
        if(input=='s')
        position_x++;
        if(input=='w')
        position_x--;
        if(input==' ')
        {
            bullet_x=position_x-1;
            bullet_y=position_y;
        }

   }
}
int main()
{
    startup();
    while(1)//游戏循环执行
    {
        show();//显示画面
        updatewithoutinput();//与用户输入无关的更新
        updatewithinput();//与用户输入有关的更新
    }
    return 0;
}
